/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Codigo;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.regex.PatternSyntaxException;
import javax.swing.JOptionPane;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Ricardo
 */
public class JDBuscaCliente extends javax.swing.JDialog {
    
    private ModeloBuscarClientes modeloTabla;
    private TableRowSorter<TableModel> sorter;
    boolean esCita;

    /**
     * Creates new form JDBuscaCliente
     */
    public JDBuscaCliente(java.awt.Frame parent, boolean modal, boolean cita) {
        super(parent, modal);
        initComponents();
        esCita = cita;
        modeloTabla = new ModeloBuscarClientes();
        tablaResultados.setModel(modeloTabla);
        sorter = new TableRowSorter<TableModel>(modeloTabla);
        tablaResultados.setRowSorter(sorter);
        acomodarColumnas();
        
        txtFiltro.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                String texto = txtFiltro.getText();
                if (texto.length() == 0) {
                    sorter.setRowFilter(null);
                    
                } else {
                    try {
                        sorter.setRowFilter(RowFilter.regexFilter(texto));
                    } catch (PatternSyntaxException ex) {
                        JOptionPane.showMessageDialog(null, "Patrón de exp reg incorrecto",
                                "Seleccionar cliente", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
            
            @Override
            public void keyPressed(KeyEvent arg0) {
            }
            
            @Override
            public void keyReleased(KeyEvent arg0) {
            }
        });
    }
    
    private void acomodarColumnas() {
        tablaResultados.getColumnModel().getColumn(0).setPreferredWidth(100);
        tablaResultados.getColumnModel().getColumn(1).setPreferredWidth(500);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tablaResultados = new javax.swing.JTable();
        panelFiltro = new javax.swing.JPanel();
        txtFiltro = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Seleccionar cliente");

        tablaResultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaResultados.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaResultadosMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tablaResultados);

        panelFiltro.setBorder(javax.swing.BorderFactory.createTitledBorder("Filtro"));

        txtFiltro.setFont(new java.awt.Font("Ubuntu", 2, 18)); // NOI18N

        javax.swing.GroupLayout panelFiltroLayout = new javax.swing.GroupLayout(panelFiltro);
        panelFiltro.setLayout(panelFiltroLayout);
        panelFiltroLayout.setHorizontalGroup(
            panelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelFiltroLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(txtFiltro)
                .addContainerGap())
        );
        panelFiltroLayout.setVerticalGroup(
            panelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelFiltroLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(txtFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 531, Short.MAX_VALUE)
                    .addComponent(panelFiltro, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 281, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(27, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void tablaResultadosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaResultadosMouseClicked
        if (evt.getClickCount() == 2) {
            
            txtFiltro.setText("");
            sorter.setRowFilter(null);
            
            if (esCita) {
                FrmCitas.establecerClienteCbo(obtenerNombreCliente());
            } else {
                Asistente.establecerClienteCbo(obtenerNombreCliente());
            }
            
            dispose();
        }
    }//GEN-LAST:event_tablaResultadosMouseClicked
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel panelFiltro;
    private javax.swing.JTable tablaResultados;
    private javax.swing.JTextField txtFiltro;
    // End of variables declaration//GEN-END:variables

    private String obtenerNombreCliente() {
        int filaSeleccionada = tablaResultados.getSelectedRow();
        return modeloTabla.getValueAt(filaSeleccionada, 1).toString();
    }
}

class ModeloBuscarClientes extends AbstractTableModel {
    
    private final String[] NOMBRE_COLUMNAS = {"idCliente", "Nombre", "Correo",
        "Fecha de nacimiento", "Edad"};
    private PreparedStatement obtenerClientes;
    private Connection conexion;
    private ResultSet conjuntoResultados;
    private ResultSetMetaData metaDatos;
    private int numeroDeFilas;
    private boolean conectadoABaseDatos = false;
    
    ModeloBuscarClientes() {
        
        conexion = FrmPrincipal.conexion;
        conectadoABaseDatos = true;
        
        try {
            
            obtenerClientes = conexion.prepareStatement("SELECT Clientes.idCliente, "
                    + "Clientes.Nombre FROM Clientes");
            
            realizarConsulta();
            
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
    public void realizarConsulta() throws SQLException, IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        conjuntoResultados = obtenerClientes.executeQuery();
        
        metaDatos = conjuntoResultados.getMetaData();
        
        conjuntoResultados.last();
        numeroDeFilas = conjuntoResultados.getRow();
        
        fireTableStructureChanged();
    }
    
    @Override
    public Class getColumnClass(int columna) throws IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        try {
            String nombreClase = metaDatos.getColumnClassName(columna + 1);
            
            return Class.forName(nombreClase);
        } catch (Exception excepcion) {
            excepcion.printStackTrace();
        }
        
        return Object.class;
    }
    
    @Override
    public int getColumnCount() throws IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        try {
            return metaDatos.getColumnCount();
        } catch (SQLException excepcionSql) {
            excepcionSql.printStackTrace();
        }
        return 0;
    }
    
    @Override
    public String getColumnName(int columna) throws IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        try {
            return metaDatos.getColumnName(columna + 1);
            
        } catch (Exception excepcion) {
            excepcion.printStackTrace();
        }
        
        return "";
    }
    
    @Override
    public int getRowCount() throws IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        return numeroDeFilas;
    }
    
    @Override
    public Object getValueAt(int fila, int columna) throws IllegalStateException {
        
        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }
        
        try {
            conjuntoResultados.absolute(fila + 1);
            return conjuntoResultados.getObject(columna + 1);
        } catch (SQLException excepcionSql) {
            excepcionSql.printStackTrace();
        }
        
        return "";
    }
    
    public void desconectarDeBaseDeDatos() {
        if (conectadoABaseDatos) {
            
            try {
                conjuntoResultados.close();
                conexion.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                conectadoABaseDatos = false;
            }
        }
    }
}
